package ATM;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATMSystem {


    public static void main(String[] args) {
        //建立好标准的javabean之后 建立一个集合容器 放封装好的对象信息
        ArrayList<Account> accounts=new ArrayList<>();
        showMain(accounts);
    }
    public static void showMain(ArrayList<Account> accounts){
        Scanner sc=new Scanner(System.in);
        System.out.println("============================================");
        while (true) {

            System.out.println("请你输入要操作的命令");
            System.out.println("1.登录账户");
            System.out.println("2.开通账户");
            System.out.println("你可以输入命令了:");
            int command=sc.nextInt();
            //然后switch判断command
            switch (command){
                case 1://登录账户的方法
                    login(accounts,sc);
                    break;
                case 2://注册账户的方法 最后返回的是一个注册好的账户对象信息 上面有个扫描器 方便则可以传进去
                    register(accounts,sc);
                    break;
                default:
                    System.out.println("你输入的命令当前不被支持");
                    break;
            }
        }
    }
    /*
    * 登录账户的方法
    * */
    private static void login(ArrayList<Account> accounts, Scanner sc) {
        //做个登录拦截 在集合中没有任何集合对象的时候不能直接进行登录
        if(accounts.size()==0){
            System.out.println("当前系统中无任何用户，你需要先注册用户");
            return;
        }
        //让用户录入卡号 根据卡号查询账户对象
        System.out.println("请你输入卡号:");
        while (true) {
            String carId = sc.next();
            Account acc = getAccountBycarId(carId, accounts);
            if(acc!=null){
                System.out.println("请继续输入密码:");
                while (true) {
                    String password = sc.next();
                    if(password.equals(acc.getPassword())){
                        //则提示登录成功 登录成功后则展示登录成功的页面
                        System.out.println(acc.getUserName()+" 恭喜你登录成功,您的卡号是 "+acc.getCarId());
                        showUserCommand(sc,acc,accounts);
                    return;//继续结束登录方法
                    }
                    else {
                        System.out.println("密码错误，请重新输入密码");
                    }
                }
            }else {
                System.out.println("卡号不存在 请继续输入卡号:");
            }
        }
    }
    /*
    * 登录进去之后用户需要操作的界面
    * */
    private static void showUserCommand(Scanner sc,Account acc,ArrayList<Account> accounts) {
        System.out.println("=====================用户操作界面===========================");
        while (true) {
        System.out.println("1.查询账户");
        System.out.println("2.存款");
        System.out.println("3.取款");
        System.out.println("4.转账");
        System.out.println("5.修改密码");
        System.out.println("6.退出");
        System.out.println("7.注销用户");

            System.out.println("请你输入你要操作的命令");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    //查询账户
                    showAccount(acc);
                    break;
                case 2:
                    //存款
                    depositMoney(acc,sc);
                    break;
                case 3:
                    //取款
                    drawMoney(acc,sc);
                    break;
                case 4:
                    //转账
                    transferMoney(accounts,acc,sc);
                    break;
                case 5:
                    //修改密码
                    updatePassword(acc,sc);
                    return;
                case 6:
                    //退出
                    System.out.println("欢迎下次光临");
                    return;
                case 7:
                    //注销用户 从集合中抹掉当前对象
                    accounts.remove(acc);
                    System.out.println("销户成功");
                    return;
                default:
                    System.out.println("你输入的命令有误");
                    break;
            }
        }
    }

    /**
     * 修改密码功能
     * @param acc
     * @param sc
     */
    private static void updatePassword(Account acc, Scanner sc) {
        while (true) {
            System.out.println("请你输入当前用户的密码:");
            String pwd = sc.next();
            if(pwd.equals(acc.getPassword())){
                while (true) {
                    System.out.println("请你输入要修改的密码:");
                    String uppwd = sc.next();
                    System.out.println("请你确认要修改的密码:");
                    String okpwd = sc.next();
                    if(uppwd.equals(okpwd)){
                        acc.setPassword(okpwd);
                        System.out.println("密码修改成功");
                        return;
                    }
                    else{
                        System.out.println("两次修改的密码不一致，请重新输入");
                    }
                }


            }else{
                System.out.println("验证错误");
            }
        }


    }

    /**
     * 转账功能
     * @param accounts
     * @param acc
     * @param sc
     */
    private static void transferMoney(ArrayList<Account> accounts, Account acc, Scanner sc) {
    //判断自己的账户中是否有钱
        if(acc.getMoney()<=0){
            System.out.println("你的账户中没有钱");
        }
        if(accounts.size()>=2){
            while (true) {
                System.out.println("请输入对方的卡号:");
                String carId = sc.next();
                Account otheracc = getAccountBycarId(carId, accounts);
                if(otheracc!=null){
                    if(acc.getCarId().equals(otheracc.getCarId())){
                        System.out.println("转账的对象不能是自己");
                    }else{
                        while (true) {
                            String rs = "*"+otheracc.getUserName().substring(1);
                            System.out.println("请输入"+rs+"的姓氏");
                            String prename = sc.next();
                            if(otheracc.getUserName().startsWith(prename)){
                                System.out.println("请您输入转账的金额（您最多可以转账：" + acc.getMoney() +"元）：");
                                double money = sc.nextDouble();
                                if(money>=acc.getMoney()){
                                    System.out.println("余额不足");
                                }else{
                                    acc.setMoney(acc.getMoney()-money);
                                    otheracc.setMoney(otheracc.getMoney()+money);
                                    System.out.println("转账成功,你的账户余额为:"+acc.getMoney());
                                    return;
                                }
                            }else{
                                System.out.println("认证错误，重新认证");
                            }
                        }
                    }
                }else{
                    System.out.println("对方卡号不存在");
                }
            }

        }

    }

    /*
    * 取钱操作
    * */
    private static void drawMoney(Account acc, Scanner sc) {
        /*
        * 1判断当前账户是否足够100元
        * 2判断取钱金额是否超过当前限额
        * 3判断取钱金额是否超过账户余额
        * */
        System.out.println("=================取款操作=======================");
        if(acc.getMoney()>=100){
            while (true) {
                System.out.println("请你输入取钱金额:");
                double money = sc.nextDouble();
                if(money>acc.getQuotaMoney()){
                    System.out.println("取钱失败,您最多可以取"+acc.getQuotaMoney());
                }else{
                    //没超过当前限额 判断取钱金额是否超过账户余额
                    if(money>acc.getMoney()){
                        System.out.println("余额不足");
                    }else{
                        acc.setMoney(acc.getMoney()-money);
                        System.out.println("取"+money+"元成功"+"当前账户余额为"+acc.getMoney());
                        return;//取钱后干掉当前方法
                    }
                }
            }
        }else{
            System.out.println("当前账户不足100元");
        }
    }

    /*
    * 存款功能的实现
    * */
    private static void depositMoney(Account acc, Scanner sc) {
        System.out.println("=================存款操作=======================");
        System.out.println("请输入你要存入的金额:");
        double money = sc.nextDouble();
        //修改原容器中的余额
        acc.setMoney(acc.getMoney()+money);
        System.out.println("存款完成！！！！");
        //存款完成后 展示当前账户中的用户信息
        showAccount(acc);

    }

    /*
    * 查询当前用户信息
    * */
    private static void showAccount(Account acc) {
        System.out.println("=================账户详情=======================");
        System.out.println("卡号: "+acc.getCarId());
        System.out.println("姓名: "+acc.getUserName());
        System.out.println("余额: "+acc.getMoney());
        System.out.println("当前限额: "+acc.getQuotaMoney());
    }

    //1.定义一个注册卡号的方法 然后注入一个对象
    private static void register(ArrayList<Account> accounts,Scanner sc) {
        //2.键盘录入姓名 密码。。。。
        System.out.println("请你输入姓名:");
        String name = sc.next();
        String password="";
        while (true) {
            System.out.println("请你输入密码:");
            password = sc.next();
            System.out.println("请你确认密码:");
            String okpassword = sc.next();
            if(password.equals(okpassword)){
                //则通过
                break;
            }
            //不通过则要重新输入
            else{
                System.out.println("两次密码必须一致");
            }
        }
        System.out.println("请你输入当次限额：");
        double quotamoney = sc.nextDouble();
        //随机生成账户卡号 并判断卡号必须不重复
        //3.生成账户的卡号  ,卡号是8位,而且不能与其他账户重复
        String carId = creatCarId(accounts);
        //4.创建一个账户对象封装账户的信息 用有参构造
        Account account=new Account(carId,name,password,quotamoney);
        //5.把账户对象添加到集合中去
        accounts.add(account);
        System.out.println("注册成功,你的卡号是 "+account.getCarId()+" 请你妥善保管");
    }
    /*
    *3. 随机生成账户卡号 把集合送给这个方法 后面要到集合中查找这个对象
    * */
    public static String creatCarId(ArrayList<Account>accounts){
        while (true) {
        Random r=new Random();
        String carId="";
            for (int i = 0; i <8 ; i++) {
                int id = r.nextInt(10);
                carId+=id;
            }
            //判断卡号是否重复
            Account acc = getAccountBycarId(carId, accounts);
            if(acc==null){//不重复的i情况下
//                break;
                return carId;
            }
            //否则则要重新生成8位数字
        }
    }
    /*
    *  判断卡号是否重复 根据卡号 查询账号对象 没查到返回Null则不重复 查到了则重新查询
    * */
    public static Account getAccountBycarId(String carId,ArrayList<Account>accounts){
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            if(carId.equals(acc.getCarId())){
                return acc;
                //代表查到了 则重新遍历集合
            }
        }
        //没查到 则返回空
        return null;
    }

}
